<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>查询时权重提升 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-time-boosting.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-time-boosting.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/query-time-boosting.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/query-time-boosting.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="search-in-depth.html">深入搜索</a></span>
»
<span class="breadcrumb-link"><a href="controlling-relevance.html">控制相关度</a></span>
»
<span class="breadcrumb-node">查询时权重提升</span>
</div>
<div class="navheader">
<span class="prev">
<a href="practical-scoring-function.html">« Lucene 的实用评分函数</a>
</span>
<span class="next">
<a href="query-scoring.html">使用查询结构修改相关度 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-time-boosting"></a>查询时权重提升<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/170_Relevance/20_Query_time_boosting.asciidoc">edit</a>
</h2>
</div></div></div>
<p>在 <a class="xref" href="multi-query-strings.html#prioritising-clauses" title="语句的优先级">语句优先级（Prioritizing Clauses）</a> 中，我们解释过如何在搜索时使用 <code class="literal">boost</code> 参数让一个查询语句比其他语句更重要。例如：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">GET /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "quick brown fox",
              "boost": 2 <a id="CO109-1"></a><i class="conum" data-value="1"></i>
            }
          }
        },
        {
          "match": { <a id="CO109-2"></a><i class="conum" data-value="2"></i>
            "content": "quick brown fox"
          }
        }
      ]
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO109-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">title</code> 查询语句的重要性是 <code class="literal">content</code> 查询的 2 倍，因为它的权重提升值为 <code class="literal">2</code> 。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO109-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>没有设置 <code class="literal">boost</code> 的查询语句的值为 <code class="literal">1</code> 。</p>
</td>
</tr>
</table>
</div>
<p><em>查询时的权重提升</em> 是可以用来影响相关度的主要工具，任意类型的查询都能接受 <code class="literal">boost</code> 参数。将 <code class="literal">boost</code> 设置为 <code class="literal">2</code> ，并不代表最终的评分 <code class="literal">_score</code> 是原值的两倍；实际的权重值会经过归一化和一些其他内部优化过程。尽管如此，它确实想要表明一个提升值为 <code class="literal">2</code> 的句子的重要性是提升值为 <code class="literal">1</code> 语句的两倍。</p>
<p>在实际应用中，无法通过简单的公式得出某个特定查询语句的 “正确” 权重提升值，只能通过不断尝试获得。需要记住的是 <code class="literal">boost</code> 只是影响相关度评分的其中一个因子；它还需要与其他因子相互竞争。在前例中， <code class="literal">title</code> 字段相对 <code class="literal">content</code> 字段可能已经有一个 “缺省的” 权重提升值，这因为在 <a class="xref" href="scoring-theory.html#field-norm" title="字段长度归一值">字段长度归一值</a> 中，标题往往比相关内容要短，所以不要想当然的去盲目提升一些字段的权重。选择权重，检查结果，如此反复。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_提升索引权重"></a>提升索引权重<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/170_Relevance/20_Query_time_boosting.asciidoc">edit</a>
</h3>
</div></div></div>
<p>当在多个索引中搜索时，可以使用参数 <code class="literal">indices_boost</code> 来提升整个索引的权重，在下面例子中，当要为最近索引的文档分配更高权重时，可以这么做：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">GET /docs_2014_*/_search <a id="CO110-1"></a><i class="conum" data-value="1"></i>
{
  "indices_boost": { <a id="CO110-2"></a><i class="conum" data-value="2"></i>
    "docs_2014_10": 3,
    "docs_2014_09": 2
  },
  "query": {
    "match": {
      "text": "quick brown fox"
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO110-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>这个多索引查询涵盖了所有以字符串 <code class="literal">docs_2014_</code> 开始的索引。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO110-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>其中，索引 <code class="literal">docs_2014_10</code> 中的所有文件的权重是 <code class="literal">3</code> ，索引 <code class="literal">docs_2014_09</code> 中是 <code class="literal">2</code> ，其他所有匹配的索引权重为默认值 <code class="literal">1</code> 。</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_t_getboost"></a>t.getBoost()<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/170_Relevance/20_Query_time_boosting.asciidoc">edit</a>
</h3>
</div></div></div>
<p>这些提升值在 Lucene 的 <a class="xref" href="practical-scoring-function.html" title="Lucene 的实用评分函数">实用评分函数</a> 中可以通过 <code class="literal">t.getBoost()</code> 获得。权重提升不会被应用于它在查询表达式中出现的层，而是会被合并下转至每个词中。 <code class="literal">t.getBoost()</code> 始终返回当前词的权重或当前分析链上查询的权重。</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>实际上，要想解读 <a class="xref" href="relevance-intro.html#explain" title="理解评分标准"><code class="literal">explain</code></a> 的输出是相当复杂的，在 <code class="literal">explanation</code> 里面完全看不到 <code class="literal">boost</code> 值，也完全无法访问上面提到的 <code class="literal">t.getBoost()</code> 方法，权重值融合在 <a class="xref" href="practical-scoring-function.html#query-norm" title="查询归一因子"><code class="literal">queryNorm</code></a> 中并应用到每个词。尽管说， <code class="literal">queryNorm</code> 对于每个词都是相同的，还是会发现一个权重提升过的词的 <code class="literal">queryNorm</code> 值要高于一个没有提升过的。</p>
</div>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="practical-scoring-function.html">« Lucene 的实用评分函数</a>
</span>
<span class="next">
<a href="query-scoring.html">使用查询结构修改相关度 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>